/**
 * @param {function} fn 需要debounce防抖函数处理的函数
 * @param {number} delay 定时器延时的时间
 */
export function debounce(fn, delay) {
  let timer = null
  // 该变量常驻内存，可以记住上一次的状态
  // 只有在外层函数失去引用时，该变量才会清除
  // 缓存定时器id

  return (...args) => {
    // 返回一个闭包
    // 注意参数：比如事件对象 event 能够获取到
    if (timer) {
      // timer存在，就清除定时器
      // 清除定时器，则定时器对应的回调函数也就不会执行
      clearTimeout(timer)
    }
    // 清除定时器后，重新计时
    timer = setTimeout(() => {
      fn.call(this, ...args)
      // this需要定时器回调函数时才能确定，this指向调用时所在的对象，大多数情况都指向window
    }, delay)
  }
}
